package com.designPattern.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 【代理模式】
 * 【动态代理】--JDK代理
 * 通过事实现Proxy.newProxyInstance(),完成不同对象的动态代理(需要实现接口)
 * @author mxs
 */
public class ProxyFactory {
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    //给目标生成一个代理对象
    public Object getProxyInstance(){
        //jdk自带的动态代理
        /**
         * loader:类加载器（这里是固定的）
         * interface:需要被增强类的接口（这个可以参考静态代理模式）
         * invocationHandler:增强处理方法
         */
        return Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            //定义了需要如何去增强被代理的方法
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("jdk代理开始");
                //通过反射去调用方法，获取该方法的返回值
                Object returnVal = method.invoke(target);
                System.out.println("代理结束");
                return returnVal;
            }
        });
    }
}
